IOS KVC Custom Collection Operator

這篇的來源,源自於bou.io

他在他的Blog有提到,這個東西算是未公開的官方用法(就是官方沒有寫可以這樣用,但是這樣寫又會自動被呼叫到XD)

直接提一下 KVC Custom Collection Operator 的格式長怎樣

- (id) _<operator>ForKeyPath:(NSString*)keyPath

例如,我們定義一個operator 為 times (times 我的意思是相乘)

所以,依照上面的格式來定義我們的Method Name 就是:

- (id) _timesForKeyPath:(NSString*)keyPath

他的呼叫方式如下

[array valueForKeyPath:@"@times.1000"]

這邊挺好玩的地方是當你呼叫上面的Code

他會自動把你的keyPath 自動拆成兩個部分 @times & 1000

@times 會被拿去搜尋方法,最後找到了你定義的_timesForKeyPath:

剩下的 1000 會被當作 _timesForKeyPath: 的參數傳入

最後用 Code 說明一切!!

KVC Custom Collection Operator
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

[@[@1,@2,@3] valueForKeyPath:@"@times.1000"]; // return @[@1000,@2000,@3000]

@implementation NSArray (Yume)

- (id) _timesForKeyPath:(NSString*)keyPath
{
// Now keyPath is @"1000"
NSMutableArray * values = [NSMutableArray new];
for (NSNumber* obj in self) {
@try {
[values addObject:@([obj doubleValue] * [keyPath doubleValue])];
}
@catch (id) {}
}
return [NSArray arrayWithArray:values];
}

@end